Zum Abschluss wollen wir uns noch ein kleines Programm basteln, das passiv auf das Eintreffen
eines Signals wartet.
In dem Fall das Signal SIG User 1.
In diesem Beispiel wollen wir uns nun ein kleines Programm schreiben, das passiv auf
das Eintreten des Signals SIG User 1 wartet.
Dafür habe ich hier bereits ein kleines Programm vorbereitet, das zwar bereits auf das Auftreten
des Signals wartet, jedoch in einer aktiven Variante.
Nämlich sehen wir hier eine Schleife, die solange iteriert, bis die Variable Event ungleich
Null ist.
Dies wollen wir nun ändern, sodass wir hier nicht mehr unnötig CPU Zeit vergeulten.
Dazu öffne ich gleich eine zweite C-Datei.
Diese heißt Passive.C und entspricht im Moment noch genauer der Active.C.
Wir wollen diese nun erweitern, sodass hier passiv gewartet wird.
Um passiv zu warten, können wir den Systemaufruf SIG Suspend nutzen.
Dieser blockiert solange, bis ein bestimmtes Signal eingetroffen ist.
Dabei wird SIG Suspend von jedem Signal unterbrochen, das nicht blockiert ist.
Damit wir passiv auf das Eintreten eines Signals warten können, müssen wir die Funktion
SIG Suspend nutzen.
Dieser blockiert solange, bis ein Signal eintritt, das nicht blockiert ist.
Damit wir SIG Suspend nutzen können, müssen wir zunächst einmal sicherstellen, dass zu
dem Zeitpunkt, an dem wir uns schlafen legen, das Event nicht bereits eingetroffen ist.
Das heißt, dass wir kein Lost-Wake-Up-Problem haben.
Um dies sicherstellen, blockieren wir einmal vor der ersten Schleifen-Iteration das Signal
für SIG User 1, sodass wir anschließend die Bedingungsvariable Event prüfen können,
ob das Signal bereits aufgetreten ist und im Negativfall uns schlafen legen können,
bis das Signal auftritt.
Damit wir nun das Signal SIG User 1 blockieren können, brauchen wir den Aufruf SIG Proc
Mask, der eine neue Signalmaske als Argument erwartet.
Dafür erstellen wir uns nun zwei Signalmasken.
Einmal eine Signalmaske Suspend, in der das Signal SIG User 1 blockiert ist und einen
weiteren Platzhalter für die im Moment aktive Signalmaske.
Nun können wir Suspend initialisieren und das Signal SIG User 1 hinzufügen.
Anschließend wollen wir die Signalmaske setzen.
Dies geschieht mit SIG Proc Mask.
SIG Proc Mask erwartet als erstes Argument einen Integer, der angibt, wie die Signalmaske
zu behandeln ist.
In dem Fall wollen wir ein zusätzliches Signal blockieren, also nutzen wir die Option SIG
Block, mit der weitere Signale zur aktuellen Signalmaske hinzugefügt werden können.
Und dabei wollen wir die Signale, die in Suspend gesetzt sind, blockieren.
Außerdem wollen wir uns die alte Signalmaske sichern.
Anschließend müssen wir schauen, welche Fehler SIG Proc Mask werfen kann.
SIG Proc Mask gibt im Erfolgsfall Null zurück.
Im Fehlerfall wird die Erno gesetzt.
Damit haben wir das SIG User Signal blockiert und wir können nun sicher auf die Event Variable
zugreifen und diese prüfen.
Wenn Event gleich Null sein sollte, ist das Signal noch nicht eingetroffen.
Also wollen wir uns nun schlafen legen.
Dies geschieht mit SIG Suspend.
SIG Suspend erhält eine Signalmaske, die nun anstelle der aktuellen Aktiven gesetzt
wird.
Zugänglich über
Offener Zugang
Dauer
00:08:15 Min
Aufnahmedatum
2020-12-01
Hochgeladen am
2020-12-01 21:38:17
Sprache
de-DE